<?php
class controller_NewsController {
    private $view;
    private $args;

    public function setView(View $view) {
        $this->view = $view;
        return $this;
    }

    public function setArgs($args = null) {
        if(null != $args) {
            $this->args = $args;
        }
        return $this;
    }

    public function run() {

        if(empty($this->args['action'])) {
            $this->index();
        } else {
            switch ($this->args['action']) {

                case 'index':
                    $this->index();
                    break;

                case 'edit':
                    $this->edit();
                    break;

                case 'delete':
                    $this->delete();
                    break;

                case 'save':
                    $this->save();
                    break;

                case 'saveComment':
                    $this->saveComment();
                    break;

                case 'delComment':
                    $this->delComment();
                    break;

                case 'byTag':
                    $this->viewByTag();
                    break;

                case 'byUser':
                    $this->viewByUser();
                    break;

                case 'filter':
                    $this->filter();
                    break;

                default:
                    $this->index();
            }
        }
    }

    public function index() {
        $user = model_UserMapper::getCurrentUser();
        $mapper = new model_NewsMapper();
        
        if(empty($this->args['id'])) { //если id пустой, то отрисовывем все новости (fetchAll)

            $nums = 8; // количество постов на страницу
            $pages = model_ConfigMapper::getPages($nums, $mapper->getTable()); //узнаем количество страниц

            if (!empty($this->args['page'])) { //проверка, какая страница указана
                if (1 > $this->args['page']) {
                    $page = 1;
                } elseif($this->args['page']>$pages) {
                    $page = $pages;
                } else {
                    $page = $this->args['page'];
                }
            } else {
                $page = 1;
            }

            $start = ($page - 1)* $nums;
            $this->view->allModels = $mapper->fetchAll($start, $nums);
            
            $link = 'controller=news';
            $this->view->paginator = model_ConfigMapper::getPaginator($page, $pages, $link); //конструируем пагинатор
            $this->view->setRenderTemplate("news/indexFetchAll.phtml");

        } else { //если же он указан, то ищем новость с этим id
            $comment = new model_CommentMapper();
            $tag = new model_TagMapper();
            $userMapper = new model_UserMapper();
            
            $this->view->oneModel = $mapper->find($this->args['id']); //ищем новость
            $this->view->user = $userMapper->find($this->view->oneModel->getAuthor()); //ищем её владельца
            $this->view->allComments = $comment->fetchAll($this->args['id']); //ищем её комменты
            $this->view->allTags = $tag->fetchById($this->args['id']); // ищем её теги

            if(null != $this->view->oneModel->getId()) {
                $this->view->setRenderTemplate("news/indexFind.phtml");

            } else {
                $this->view->message = 'Такой новости нет!';
                $this->view->setRenderTemplate("error.phtml");
            }
        }
    }


    public function edit() {
        $user = model_UserMapper::getCurrentUser();
        $tag = new model_TagMapper();
        if(null == $user->getId()) {
            $this->view->message = 'У вас нет доступа к этой функции!';
            $this->view->setRenderTemplate("error.phtml");
            return;
        } else {
            $mapper = new model_NewsMapper();
            if(!empty($this->args['id'])) {
                $this->view->oneModel = $mapper->find($this->args['id']);
                $this->view->activeTags = $tag->fetchById($this->args['id']);

                if('admin' != $user->getRole()) {
                    if($user->getId() != $this->view->oneModel->getAuthor()) {
                        $this->view->message = 'У вас нет доступа к этому сообщению!';
                        $this->view->setRenderTemplate("error.phtml");
                        return;
                    }
                }
            }
            $photoMapper = new model_PhotoMapper();
            $this->view->allImgs = $photoMapper->fetchAll($user->getId());
            $this->view->allTags = $tag->fetchAll();
            $this->view->setRenderTemplate("news/edit.phtml");
        }
    }

    public function delete() {
        $user = model_UserMapper::getCurrentUser();
        $mapper = new model_NewsMapper();
        $message = $mapper->find($this->args['id']);

        if (null == $user->getId()) {
            $this->view->message = 'У вас нет доступа к этой функции!';
            $this->view->setRenderTemplate("error.phtml");
            return;
        }

        if($user->getId() != $message->getAuthor()) {
            if('admin' != $user->getRole()) {
                $this->view->message = 'У вас нет доступа к этому сообщению!';
                $this->view->setRenderTemplate("error.phtml");
                return;
            }
        }

        if(!empty($this->args['id'])) {
            $mapper->delete($this->args['id']);
            $this->view->setRenderTemplate("redirect.phtml");
        } else {
            $this->view->setRenderTemplate("redirect.phtml");
        }
    }

    public function save() {
        
        if(!empty ($_POST)) {
            $user = model_UserMapper::getCurrentUser();
            $mapper = new model_NewsMapper();
            $tag = new model_TagMapper();
            $post = model_ConfigMapper::validate($_POST);
            $this->view->message = $mapper->checkMsg($post); //проверяем, заполнены ли поля

            if (empty($this->view->message)) { //если да, то идем дальше

                $post['author'] = $user->getId();
                $post['date'] = date('Y-m-d H:i:s');

                $post['content'] = model_ConfigMapper::sqlValid($post['content']);
                $post['title'] = model_ConfigMapper::sqlValid($post['title']);

                $model = new model_NewsModel($post);

                $mapper->save($model); //сохраняем новость

                if ('' == $post['id']) { //при создании новой новости айди оказывается пустой, для сохранений изображения указываем его
                    $post['id'] = mysql_insert_id();
                }


                if(!empty($post['tag'])) { //если указаны теги, сохраняем их
                    foreach ($post['tag'] as $val) {
                        if(false == model_ConfigMapper::ifExist($val, 'id', 'tags')) { //если приходит существующий айди тега, то идеи дальше
                            $this->view->message = 'Ошибка запроса';
                            $this->view->setRenderTemplate("error.phtml");
                            return;
                        }
                        $tag->saveTagsToNews($post['id'], $post['tag']);
                    }
                }

                $this->view->link = 'index.php?controller=news&action=index&id='. $post['id'];
                $this->view->setRenderTemplate("redirect.phtml");
                return;
            } else {
                $this->view->oneModel = new model_NewsModel();
                $this->view->oneModel->setTitle($post['title'])
                        ->setContent($post['content']);
                if(!empty ($post['img'])){
                $this->view->oneModel->setImg($post['img']);
                }
                $photoMapper = new model_PhotoMapper();
                $this->view->allImgs = $photoMapper->fetchAll($user->getId());
                $this->view->allTags = $tag->fetchAll();
                $this->view->setRenderTemplate("news/edit.phtml");
                return;
            }
        } else {
            $this->view->message = 'Ошибка запроса';
            $this->view->setRenderTemplate("error.phtml");
            return;
        }
    }


    public function saveComment() {
        if(!empty ($_POST)) {
            $mapper = new model_CommentMapper();
            $post = model_ConfigMapper::validate($_POST);

// проверка, портит ли пользователь в запросе имя хидден поля
            if (empty($post['parentid'])) {
                $this->view->message = 'Ошибка запроса';
                //можно запилить ссылочку "назад"
                $this->view->setRenderTemplate("error.phtml");
                return;
            }

            $user = model_UserMapper::getCurrentUser();

            $text = model_ConfigMapper::sqlValid($post['text']);

            $model = new model_CommentModel();
            $model->setAuthor($user->getId())
                    ->setDate(date('Y-m-d H:i:s'))
                    ->setParentId($post['parentid'])
                    ->setText($text);

            
            if(model_ConfigMapper::ifExist($model->getParentId(), 'id', 'news')) {
                $mapper->save($model);
                $this->view->link = 'index.php?controller=news&action=index&id='.$model->getParentId();
                $this->view->setRenderTemplate("redirect.phtml");
                return;
            } else {
                $this->view->message = 'Ошибка запроса';
                $this->view->setRenderTemplate("error.phtml");
                return;
            }

        } else {
            $this->view->message = 'Ошибка запроса';
            $this->view->setRenderTemplate("error.phtml");
            return;
        }
    }

    public function delComment() {

        $user = model_UserMapper::getCurrentUser();
        $mapper = new model_CommentMapper();
        $comment = $mapper->find($this->args['id']);

        //Разрулить ситуацию! если мы админ, то должны мочь удалять/редактировать всё
        //если же мы без роли, то не можем делать ничего.
        if(null == $user->getId() || $user->getId() != $comment->getAuthor()) {
            if('admin' != $user->getRole()) {
                $this->view->message = 'У вас нет доступа!';
                $this->view->setRenderTemplate("error.phtml");
                return;
            }
        }

        if(!empty($this->args['id'])) {
            $mapper->delete($this->args['id']);

            $this->view->link = 'index.php?controller=news&action=index&id='. $comment->getParentId() ;
            $this->view->setRenderTemplate("redirect.phtml");
        }
    }

    public function viewByTag() {
        $user = model_UserMapper::getCurrentUser();
        if (null != $user->getId()) {
            if (!empty($this->args['id'])) {

                $mapper = new model_NewsMapper();
                $tagMapper = new model_TagMapper();

                $this->view->allModels = $mapper->fetchByItem( 'tagtonews', 'tagid', $this->args['id']);

                $tag = $tagMapper->find($this->args['id']);
                $this->view->searchItem = $tag->getText();
                $this->view->itemCat = 'с тегом';
                $this->view->setRenderTemplate("news/indexFetchAll.phtml");

            } else {
                $this->view->setRenderTemplate("redirect.phtml");
            }
        } else {
            $this->view->message = 'У вас нет доступа к этой функции!';
            $this->view->setRenderTemplate("error.phtml");
            return;
        }
    }

    public function viewByUser() {
        $user = model_UserMapper::getCurrentUser();
        if (null != $user->getId()) {
            if (!empty($this->args['id'])) {

                $mapper = new model_NewsMapper();
                $userMapper = new model_UserMapper();

                $this->view->allModels = $mapper->fetchByItem('news', 'author', $this->args['id']);
                $user = $userMapper->find($this->args['id']);
                $this->view->searchItem = $user->getUsername();
                $this->view->itemCat = 'юзера';
                $this->view->setRenderTemplate("news/indexFetchAll.phtml");

            } else {
                $this->view->setRenderTemplate("redirect.phtml");
            }
        } else {
            $this->view->message = 'У вас нет доступа к этой функции!';
            $this->view->setRenderTemplate("error.phtml");
            return;
        }
    }

    public function filter() {
        $user = model_UserMapper::getCurrentUser();
        if(empty($_POST)) { // если пост пустой, значит мы попали сюда войдя в Фильтр постов
            if(null == $user->getId()) {
                $this->view->message = 'У вас нет доступа к этой функции!';
                $this->view->setRenderTemplate("error.phtml");
                return;
            } else {
                $this->view->setRenderTemplate("news/filter.phtml");
            }
        } else { //если же пост не пустой,
            $post = model_ConfigMapper::validate($_POST);
            if ($post['fromage']<=$post['toage'] || (0 == $post['fromage'] || 0 == $post['toage'])) { //если криво указан возраст, то возвращаем в форму
                if('' == $post['name'] && 0 == $post['fromage'] && 0 == $post['toage'] && empty($post['age'])) { //если не указан не один пареметр поиска, то редиректим на всю стену
                    $this->view->setRenderTemplate("redirect.phtml");
                    return;
                } else {
                    $mapper = new model_UserMapper();
                    $this->view->allModels = $mapper->filter($post);
                    $text = ''; // конструктор описания запроса, которое выдается во вьюшке
                    if ('' != $post['name']) {
                        $text .= '</b> имя, похожее на <b>'. $post['name'];
                    }
                    if (!empty($post['sex'])) {
                        $text .= '</b> пол <b>';
                        if ('m' == $post['sex']){
                            $text .= 'мужской';
                        } else {
                            $text .= 'женский';
                        }
                    }
                    if(!empty($post['fromage']) || !empty($post['toage'])) {
                        $text .= '</b> возраст ' ;
                        if (0 != $post['fromage']) {
                            $text .= 'от <b>'. $post['fromage'];
                        }
                        if (0 != $post['toage']) {
                            $text .= '</b> до <b>'. $post['toage'];
                        }
                    }
                    $this->view->searchItem = $text;
                    $this->view->itemCat = 'юзеров с параметрами:';
                    $this->view->setRenderTemplate("news/indexFetchAll.phtml");
                }
            } else {
                $this->view->message = 'Указан неверный возраст';
                $this->view->post = $post;
                $this->view->setRenderTemplate("news/filter.phtml");
                return;
            }
        }
    }
}